package com.controller.data;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.FlashMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.support.RequestContextUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
@RequestMapping("/data")
public class DataController {


    // 1.第一种方法往视图传递数据，传统的对象
    @RequestMapping("/a1")
    public String a1(HttpServletRequest request, HttpSession session) {
        request.setAttribute("msg", "req msg");
        session.setAttribute("msg", "session msg");
        request.getServletContext().setAttribute("msg", "context msg");
        //渲染  （Render）
        return "index";
    }

    // 2.第二种方法往视图传递数据，ModelAndView
    @RequestMapping("/a2")
    public ModelAndView a2() {
        //下面的数据还是放在请求作用域内
        ModelAndView mav = new ModelAndView();
        mav.setViewName("index");
        mav.addObject("msg", "modelandview");
        return mav;
    }

    // 3.第三种方法往视图传递数据，Model
    @RequestMapping("/a3")
    public String a3(Model model) {
        model.addAttribute("msg", "model");
        return "index";
    }

    // 4.第四种方法往视图传递数据，其实与第三种类似
    @RequestMapping("/a4")
    public String a4(Model model, ModelMap modelMap, Map<String, Object> map) {
        model.addAttribute("msg", "model");
        modelMap.addAttribute("msg1", "model map");
        map.put("msg2", "map");
        return "index";
    }

    // ========================重定向怎么传数据？？======

    // 1. 通过url a4?a=2&b=3   优点：简单，缺点：只能传简单的数据以及数量有限
    //2. httpsession,servletContext  优点：复杂数据，缺点：占内存


    @RequestMapping("/a5")
    public String a5() {

        return "redirect:a6?msg=urlredire";
    }

    @RequestMapping("/a6")
    public String a6() {
        return "index";
    }

    //===
    @RequestMapping("/a7")
    public String a7(HttpSession session) {
        session.setAttribute("msg", "s redirect");
        return "redirect:a8";
    }

    @RequestMapping("/a8")
    public String a8() {
        return "index";
    }

    @RequestMapping("/a9")
    public String a9(RedirectAttributes attributes) {
        //这个里面放的数据会自动拼接到url上
        attributes.addAttribute("msg1", "add attri");
        // flash属性，是添加到session中，当你读取之后，就立即从session中删除
        //（在重定向发生前放在会话中，重定向发生后，立即从会话中删除，并放到了请求作用域中
        // 注意：不是直接把msg作为key放在session中）
        attributes.addFlashAttribute("msg", "flash attr");
        return "redirect:a10";
    }

    @RequestMapping("/a10")
    public String a10(HttpServletRequest request) {
        // 从a9重定向到这里 想获取flashAttribute里的值，用下面这种方法
        Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
        Object msg = inputFlashMap.get("msg");
        System.out.println("msg消息 = " + msg);

        //想直接从请求作用域取值是不行的，返回null，因为此时mvc框架还没有把其用msg作为key放到请求作用域中
        // 等这个控制器方法执行完毕之后才会把msg作为key放到请求作用域中
        Object msgAttr = request.getAttribute("msg");
        System.out.println("msgAttr = " + msgAttr);

        //如果现在就想从请求作用域中获取值，可以采用下面的方法，注意键不是msg
        Map<String, Object> attributeInputFlash = (Map<String, Object>) request.getAttribute("org.springframework.web.servlet.DispatcherServlet.INPUT_FLASH_MAP");
        System.out.println("attributeInputFlash = " + attributeInputFlash.get("msg"));
        return "index";
    }

    // 下面的方法了解即可，RedirectAttributes内部用的就是FlashMap来做得
    @RequestMapping("/a11")
    public String a11(HttpServletRequest request) {

        FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(request);
        outputFlashMap.put("msg", "flashmap 222");
        return "redirect:a12";
    }

    @RequestMapping("/a12")
    public String a12(HttpServletRequest request) {
        Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
        Object msg = inputFlashMap.get("msg");
        System.out.println("msg消息 = " + msg);
        return "index";

    }

}
